package p26_ControllerAdvice之ModelAttribute;

import lombok.Data;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;

@Configuration
public class WebConfig {
    @ControllerAdvice
    public static class MyControllerAdvice {

        /**
         * @ModelAttribute加在方法上：RequestMappingHandlerAdapter初始化时，一次性解析所有方法，并将其返回值作为模型数据放入模型容器
         * @ModelAttribute加在参数上：每一次访问控制器方法，会将方法参数解析出来的模型对象放入模型容器
         * @ModelAttribute加到@ControllerAdvice中 ---> 全局的模型数据
         * @ModelAttribute加到@Controller ---> 独属于本控制器的模型数据
         */
        @ModelAttribute("firstName")
        public Name hehehe() {
            Name name = new Name();
            name.setName("狗剩");
            return name;
        }

        @ModelAttribute("secondName")
        public Name hahah() {
            Name name = new Name();
            name.setName("张三");
            return name;
        }
    }

    @Controller
    public static class MyController {
        /**
         * 如果请求中没有合适的参数绑定到Name的属性上，则会到ModelAndViewContainer找到一个名称为secondName的model数据并赋值给方法
         * @param name
         * @return
         */
        @ResponseStatus(HttpStatus.OK)
        public ModelAndView foo(@ModelAttribute("secondName") Name name) {
            System.out.println(name);
            return null;
        }
    }

    @Data
    public static class Name {
        private String name;
    }
}
